﻿#ifndef VIDEOPORT_H
#define VIDEOPORT_H

#include <QFrame>
#include <QDialog>
#include <QPainter>

// 视频穿透控件
// 指定某个区域透明，让底层的视频显示出来
// T为基类
template<class T>
class VideoPort : public T
{
public:
    VideoPort(QWidget* parent) : T(parent) {}

    // 设置视频穿透使能
    void setVideoRegionEnabled(const bool enabled)
    {
        m_videoRegionEnabled = enabled;
    }

    // 设置视频穿透区域
    void setVideoRegion(const QRect& rect)
    {
        m_videoRect = rect;
    }

    // 是否整个控件区域作为视频穿透区域
    void setVideoRegionEntire()
    {
        setVideoRegion(QRect());
    }

    // TODO: 可以绑定某个视频通道
    // virtual bool bindVideoChannel(const int channelId) {};

protected:
    // TODO: 控件显示的时候，调用底层SDK，让视频显示在指定区域
    virtual void showEvent(QShowEvent* event)
    {
        T::showEvent(event);
        // open video channel
    }

    // TODO: 控件隐藏的时候，调用底层SDK，关闭视频
    virtual void hideEvent(QHideEvent* event)
    {
        T::hideEvent(event);
        // close video channel
    }

    // 重载绘图函数
    virtual void paintEvent(QPaintEvent* event) override
    {
        T::paintEvent(event);

        if (!m_videoRegionEnabled) return;

        QRect rect = m_videoRect;
        // 区域为空，则默认全部是视频区域
        if (rect.isNull())
        {
            rect = QRect(0, 0, T::width(), T::height());
        }

        // 在需要穿透的区域进行clear绘图
        QPainter p(this);
        p.setCompositionMode(QPainter::CompositionMode_Clear);
        p.fillRect(rect, Qt::SolidPattern);
    }

private:
    // 是否启用视频区域穿透，默认开启
    bool m_videoRegionEnabled = true;
    // 视频穿透区域
    QRect m_videoRect;
};

// 预制了这几个基类，如果还有其他需要，自行定义即可
using VideoPortWidget = VideoPort<QWidget>;
using VideoPortFrame  = VideoPort<QFrame>;
using VideoPortDialog = VideoPort<QDialog>;

#endif // VIDEOPORT_H
